计划阅读调试下Dubbo的源码,结合官方源码分析Dubbo,自身再分析总结
本文对应的Dubbo 服务导出
源码分析
上一节分析完Dubbo导出的代码之后发现一个问题,没有找到filter链路的调用逻辑。
但是可以在源码中清晰看到filter对应的几个实现类
1 |
|
filter基础的实现类
1 | echo=com.alibaba.dubbo.rpc.filter.EchoFilter |
之后在filter的wrapper也看到了filter链路获取的过程
1 | public class ProtocolFilterWrapper implements Protocol { |
但是这个wrapper是在哪里包装了protocol呢
这需要回顾SPI的实现
1 | // ExtensionLoader#createExtension |
以默认的Dubbo Protocol为例,在通过URL动态获取protocol的时候,其实拿到的是经过了wrapper包装后的类,可能不止经过一层,对于Protocol,涉及到的为ProtocolFilterWrapper
,ProtocolListenerWrapper
类
这两个类同样是Protocol的实现,对应在SPI配置中为
1 | filter=com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper |
这样就总体串起来了,在初次通过SPI获取类的时候,会将ProtocolFilterWrapper以及ProtocolListenerWrapper作为cacheWrapperClasses缓存起来,之后获取DubboProtocol会用这两个包装类层层包装,之后缓存并返回这个包装过的DubboProtocol,这样也就将Filter链路嵌在DubboProtocol中。